์ ์ง๋ณด์ ๋ฐ ํ์ฅ์ด ์ฉ์ดํ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ ์ํ ๊ฐ๋ ฅํ๊ณ ์์ธก ๊ฐ๋ฅํ ํจํด์ธ Elm ์ํคํ ์ฒ(Model-View-Update)์ ํต์ฌ ์์น, ์ด์ , ์ค์ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.
Elm ์ํคํ ์ฒ: Model-View-Update ํจํด์ ๋ํ ์ข ํฉ ๊ฐ์ด๋
Elm ์ํคํ ์ฒ(์ข ์ข MVU, ์ฆ Model-View-Update๋ผ๊ณ ๋ ํจ)๋ ํ๋ก ํธ์๋์ฉ์ผ๋ก ์ค๊ณ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ธ Elm์์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฐ๋ ฅํ๊ณ ์์ธก ๊ฐ๋ฅํ ํจํด์ ๋๋ค. ์ด ์ํคํ ์ฒ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๊ฐ ๋ช ํํ๊ณ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌ๋๋๋ก ๋ณด์ฅํ์ฌ, ์ ์ง๋ณด์, ํ์ฅ ๋ฐ ํ ์คํธ๊ฐ ๋ ์ฉ์ดํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด ๊ฐ์ด๋์์๋ Elm ์ํคํ ์ฒ์ ํฌ๊ด์ ์ธ ๊ฐ์, ํต์ฌ ์์น, ์ด์ ๋ฐ ์ค์ ๊ตฌํ ๋ฐฉ๋ฒ์ ์ ์ธ๊ณ ๋ ์๋ค์๊ฒ ์ ํฉํ ์์์ ํจ๊ป ์ ๊ณตํฉ๋๋ค.
Elm ์ํคํ ์ฒ๋ ๋ฌด์์ธ๊ฐ?
Elm ์ํคํ ์ฒ์ ํต์ฌ์ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ ์ํคํ ์ฒ์ ๋๋ค. ์ด๋ ๋ฐ์ดํฐ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ํตํด ํ ๋ฐฉํฅ์ผ๋ก๋ง ํ๋ฅธ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ, ์ด๋ก ์ธํด ์ฝ๋๋ฅผ ์ดํดํ๊ณ ๋๋ฒ๊น ํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค. ์ด ์ํคํ ์ฒ๋ ์ธ ๊ฐ์ง ํต์ฌ ๊ตฌ์ฑ ์์๋ก ์ด๋ฃจ์ด์ง๋๋ค:
- ๋ชจ๋ธ(Model): ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ๋ํ๋ ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ์ํ๊ณ ์ํธ์์ฉํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ์ ๋จ์ผ ์ง์ค ๊ณต๊ธ์(single source of truth)์ ๋๋ค.
- ๋ทฐ(View): ๋ชจ๋ธ์ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ์ฌ์ฉ์์๊ฒ ํ์๋ HTML(๋๋ ๋ค๋ฅธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์์)์ ์์ฑํ๋ ์์ ํจ์์ ๋๋ค. ๋ทฐ๋ ํ์ฌ ์ํ๋ฅผ ๋ ๋๋งํ๋ ์ฑ ์๋ง ์ง๋ฉฐ, ๋ถ์์ฉ(side effect)์ด ์์ต๋๋ค.
- ์ ๋ฐ์ดํธ(Update): ๋ฉ์์ง(์ฌ์ฉ์๋ ์์คํ ์ด ์์ํ ์ด๋ฒคํธ ๋๋ ์ก์ )์ ํ์ฌ ๋ชจ๋ธ์ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ์๋ก์ด ๋ชจ๋ธ์ ๋ฐํํ๋ ํจ์์ ๋๋ค. ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก์ง์ด ์ฌ๊ธฐ์ ์์นํฉ๋๋ค. ์ด ํจ์๋ ๋ค์ํ ์ด๋ฒคํธ์ ๋์ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๊ฐ ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋์ด์ผ ํ๋์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
์ด ์ธ ๊ฐ์ง ๊ตฌ์ฑ ์์๋ ์ ์ ์๋ ๋ฃจํ ์์์ ์ํธ์์ฉํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ทฐ์ ์ํธ์์ฉํ๋ฉด ๋ฉ์์ง๊ฐ ์์ฑ๋ฉ๋๋ค. ์ ๋ฐ์ดํธ ํจ์๋ ์ด ๋ฉ์์ง์ ํ์ฌ ๋ชจ๋ธ์ ๋ฐ์ ์๋ก์ด ๋ชจ๋ธ์ ์์ฑํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ทฐ๊ฐ ์๋ก์ด ๋ชจ๋ธ์ ๋ฐ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ์ด ์ฌ์ดํด์ด ๊ณ์ ๋ฐ๋ณต๋ฉ๋๋ค.
Elm ์ํคํ ์ฒ์ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ณด์ฌ์ฃผ๋ ๋ค์ด์ด๊ทธ๋จ
ํต์ฌ ์์น
Elm ์ํคํ ์ฒ๋ ์ฌ๋ฌ ๊ฐ์ง ์ฃผ์ ์์น ์์ ๊ตฌ์ถ๋์์ต๋๋ค:- ๋ถ๋ณ์ฑ(Immutability): ๋ชจ๋ธ์ ๋ถ๋ณ์ ๋๋ค. ์ด๋ ์ง์ ๋ณ๊ฒฝํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๋์ , ์ ๋ฐ์ดํธ ํจ์๋ ์ด์ ๋ชจ๋ธ๊ณผ ์์ ๋ ๋ฉ์์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ ํ ์๋ก์ด ๋ชจ๋ธ์ ์์ฑํฉ๋๋ค. ์ด๋ฌํ ๋ถ๋ณ์ฑ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ์ถ๋ก ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊ณ ์๋์น ์์ ๋ถ์์ฉ์ ๋ฐฉ์งํฉ๋๋ค.
- ์์์ฑ(Purity): ๋ทฐ์ ์ ๋ฐ์ดํธ ํจ์๋ ์์ ํจ์์ ๋๋ค. ์ด๋ ๋์ผํ ์ ๋ ฅ์ ๋ํด ํญ์ ๋์ผํ ์ถ๋ ฅ์ ๋ฐํํ๋ฉฐ ๋ถ์์ฉ์ด ์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ฌํ ์์์ฑ์ ์ด ํจ์๋ค์ ํ ์คํธํ๊ณ ์ถ๋ก ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ(Unidirectional Data Flow): ๋ฐ์ดํฐ๋ ๋ชจ๋ธ์์ ๋ทฐ๋ก, ๊ทธ๋ฆฌ๊ณ ๋ทฐ์์ ์ ๋ฐ์ดํธ ํจ์๋ก ๋จ์ผ ๋ฐฉํฅ์ผ๋ก ํ๋ฆ ๋๋ค. ์ด ๋จ๋ฐฉํฅ ํ๋ฆ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ถ์ ํ๊ณ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ๋ช ์์ ์ํ ๊ด๋ฆฌ(Explicit State Management): ๋ชจ๋ธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ํฉ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง๋ฅผ ๋ช ํํ๊ฒ ํฉ๋๋ค.
- ์ปดํ์ผ ์๊ฐ ๋ณด์ฆ(Compile-Time Guarantees): Elm ์ปดํ์ผ๋ฌ๋ ๊ฐ๋ ฅํ ํ์ ๊ฒ์ฌ๋ฅผ ์ ๊ณตํ๋ฉฐ, null ๊ฐ, ์ฒ๋ฆฌ๋์ง ์์ ์์ธ ๋๋ ๋ฐ์ดํฐ ๋ถ์ผ์น์ ๊ด๋ จ๋ ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ๋ ์ ๋ขฐํ ์ ์๊ณ ๊ฒฌ๊ณ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ด์ด์ง๋๋ค.
Elm ์ํคํ ์ฒ์ ์ด์
Elm ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ค์ํ ์ด์ ์ด ์์ต๋๋ค:- ์์ธก ๊ฐ๋ฅ์ฑ(Predictability): ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ์ ํ๋ฆฌ์ผ์ด์ ์ํ์ ๋ณํ๊ฐ ์ด๋ป๊ฒ ํธ๋ฆฌ๊ฑฐ๋๊ณ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๊ฐ ์ด๋ป๊ฒ ์ ๋ฐ์ดํธ๋๋์ง ์ฝ๊ฒ ์ดํดํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ฌํ ์์ธก ๊ฐ๋ฅ์ฑ์ ๋๋ฒ๊น ์ ๋จ์ํํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง๋ณด์๋ฅผ ์ฉ์ดํ๊ฒ ํฉ๋๋ค.
- ์ ์ง๋ณด์์ฑ(Maintainability): ๋ชจ๋ธ, ๋ทฐ, ์ ๋ฐ์ดํธ ํจ์ ๊ฐ์ ๋ช ํํ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ํ๊ณ ํ์ฅํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ํ ๊ตฌ์ฑ ์์์ ๋ณ๊ฒฝ์ด ๋ค๋ฅธ ๊ตฌ์ฑ ์์์ ์ํฅ์ ๋ฏธ์น ๊ฐ๋ฅ์ฑ์ด ์ ์ต๋๋ค.
- ํ ์คํธ ์ฉ์ด์ฑ(Testability): ๋ทฐ์ ์ ๋ฐ์ดํธ ํจ์์ ์์์ฑ์ ํ ์คํธ๋ฅผ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ๊ฐ๋จํ ๋ค๋ฅธ ์ ๋ ฅ์ ์ ๋ฌํ๊ณ ์ถ๋ ฅ์ด ์ฌ๋ฐ๋ฅธ์ง ํ์ธํ๋ฉด ๋ฉ๋๋ค.
- ํ์ฅ์ฑ(Scalability): Elm ์ํคํ ์ฒ๋ ํ์ฅ์ด ์ฉ์ดํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฑ์ฅํจ์ ๋ฐ๋ผ ๋ณต์ก์ฑ์ด๋ ๋ถ์์ ์ฑ์ ์ด๋ํ์ง ์๊ณ ์๋ก์ด ๊ธฐ๋ฅ๊ณผ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
- ์ ๋ขฐ์ฑ(Reliability): Elm ์ปดํ์ผ๋ฌ๋ ๊ฐ๋ ฅํ ํ์ ๊ฒ์ฌ๋ฅผ ์ ๊ณตํ์ฌ null ๊ฐ, ์ฒ๋ฆฌ๋์ง ์์ ์์ธ ๋๋ ๋ฐ์ดํฐ ๋ถ์ผ์น์ ๊ด๋ จ๋ ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ํ๋ก๋์ ํ๊ฒฝ์ ๋ฐฐํฌ๋๋ ๋ฒ๊ทธ ์๋ฅผ ๊ทน์ ์ผ๋ก ์ค์ฌ์ค๋๋ค.
- ์ฑ๋ฅ(Performance): Elm์ ๊ฐ์ DOM ๊ตฌํ์ ๊ณ ๋๋ก ์ต์ ํ๋์ด ์์ด ๋ฐ์ด๋ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค. Elm ์ปดํ์ผ๋ฌ๋ ๋ํ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํจ์จ์ ์ผ๋ก ์คํ๋๋๋ก ๋ค์ํ ์ต์ ํ๋ฅผ ์ํํฉ๋๋ค.
- ์ปค๋ฎค๋ํฐ ๋ฐ ์ํ๊ณ(Community and Ecosystem): Elm์ ์ง์์ ์ด๊ณ ํ๋ฐํ ์ปค๋ฎค๋ํฐ๋ฅผ ๋ณด์ ํ๊ณ ์์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋์์ด ๋๋ ํ๋ถํ ๋ฆฌ์์ค, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ค์ ๊ตฌํ: ๊ฐ๋จํ ์นด์ดํฐ ์์
๊ฐ๋จํ ์นด์ดํฐ ์์ ๋ฅผ ํตํด Elm ์ํคํ ์ฒ๋ฅผ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ์์ ๋ ์นด์ดํฐ ๊ฐ์ ์ฆ๊ฐ์ํค๊ณ ๊ฐ์์ํค๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
1. ๋ชจ๋ธ
๋ชจ๋ธ์ ์นด์ดํฐ์ ํ์ฌ ์ํ๋ฅผ ๋ํ๋ ๋๋ค. ์ด ๊ฒฝ์ฐ, ๋ชจ๋ธ์ ๋จ์ํ ์ ์์ ๋๋ค:
type alias Model = Int
2. ๋ฉ์์ง
๋ฉ์์ง๋ ์นด์ดํฐ์์ ์ํํ ์ ์๋ ๋ค์ํ ์์ ์ ๋ํ๋ ๋๋ค. ์ฌ๊ธฐ์๋ Increment์ Decrement ๋ ๊ฐ์ง ๋ฉ์์ง๋ฅผ ์ ์ํฉ๋๋ค.
type Msg
= Increment
| Decrement
3. ์ ๋ฐ์ดํธ ํจ์
์ ๋ฐ์ดํธ ํจ์๋ ๋ฉ์์ง์ ํ์ฌ ๋ชจ๋ธ์ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ์๋ก์ด ๋ชจ๋ธ์ ๋ฐํํฉ๋๋ค. ์์ ๋ ๋ฉ์์ง์ ๋ฐ๋ผ ์นด์ดํฐ๊ฐ ์ด๋ป๊ฒ ์ ๋ฐ์ดํธ๋์ด์ผ ํ๋์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
update : Msg -> Model -> Model
update msg model =
case msg of
Increment ->
model + 1
Decrement ->
model - 1
4. ๋ทฐ
๋ทฐ ํจ์๋ ๋ชจ๋ธ์ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ์ฌ์ฉ์์๊ฒ ํ์ํ HTML์ ์์ฑํฉ๋๋ค. ํ์ฌ ์นด์ดํฐ ๊ฐ์ ๋ ๋๋งํ๊ณ ์นด์ดํฐ๋ฅผ ์ฆ๊ฐ ๋ฐ ๊ฐ์์ํค๋ ๋ฒํผ์ ์ ๊ณตํฉ๋๋ค.
view : Model -> Html Msg
view model =
div []
[ button [ onClick Decrement ] [ text "-" ]
, span [] [ text (String.fromInt model) ]
, button [ onClick Increment ] [ text "+" ]
]
5. ๋ฉ์ธ ํจ์
๋ฉ์ธ ํจ์๋ Elm ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐํํ๊ณ ๋ชจ๋ธ, ๋ทฐ, ์ ๋ฐ์ดํธ ํจ์๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค. ์ด๊ธฐ ๋ชจ๋ธ ๊ฐ์ ์ง์ ํ๊ณ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ์ค์ ํฉ๋๋ค.
main : Program Never Model Msg
main =
Html.beginnerProgram
{ model = 0 -- Initial Model
, view = view
, update = update
}
๋ ๋ณต์กํ ์์ : ๊ตญ์ ํ๋ ํ ์ผ ๋ชฉ๋ก
์กฐ๊ธ ๋ ๋ณต์กํ ์์ ๋ก ๊ตญ์ ํ๋ ํ ์ผ ๋ชฉ๋ก์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด ์์ ๋ ๊ฐ๊ฐ ์ค๋ช ๊ณผ ์๋ฃ ์ํ๋ฅผ ๊ฐ์ง ์์ ๋ชฉ๋ก์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ๊ณผ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ค๋ฅธ ์ธ์ด์ ๋ง๊ฒ ์กฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
1. ๋ชจ๋ธ
๋ชจ๋ธ์ ํ ์ผ ๋ชฉ๋ก์ ์ํ๋ฅผ ๋ํ๋ ๋๋ค. ์์ ๋ชฉ๋ก๊ณผ ํ์ฌ ์ ํ๋ ์ธ์ด๋ฅผ ํฌํจํฉ๋๋ค.
type alias Task = { id : Int, description : String, completed : Bool }
type alias Model = { tasks : List Task, language : String }
2. ๋ฉ์์ง
๋ฉ์์ง๋ ํ ์ผ ๋ชฉ๋ก์์ ์ํํ ์ ์๋ ๋ค์ํ ์์ (์: ์์ ์ถ๊ฐ, ์์ ์๋ฃ ์ํ ํ ๊ธ, ์ธ์ด ๋ณ๊ฒฝ)์ ๋ํ๋ ๋๋ค.
type Msg
= AddTask String
| ToggleTask Int
| ChangeLanguage String
3. ์ ๋ฐ์ดํธ ํจ์
์ ๋ฐ์ดํธ ํจ์๋ ๋ค์ํ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ทธ์ ๋ฐ๋ผ ๋ชจ๋ธ์ ์ ๋ฐ์ดํธํฉ๋๋ค.
update : Msg -> Model -> Model
update msg model =
case msg of
AddTask description ->
{ model | tasks = model.tasks ++ [ { id = List.length model.tasks + 1, description = description, completed = False } ] }
ToggleTask taskId ->
{ model | tasks = List.map (\task -> if task.id == taskId then { task | completed = not task.completed } else task) model.tasks }
ChangeLanguage language ->
{ model | language = language }
4. ๋ทฐ
๋ทฐ ํจ์๋ ํ ์ผ ๋ชฉ๋ก์ ๋ ๋๋งํ๊ณ ์์ ์ถ๊ฐ, ์๋ฃ ์ํ ํ ๊ธ, ์ธ์ด ๋ณ๊ฒฝ์ ์ํ ์ปจํธ๋กค์ ์ ๊ณตํฉ๋๋ค. ์ ํ๋ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ์งํ๋ ํ ์คํธ๋ฅผ ํ์ํฉ๋๋ค.
view : Model -> Html Msg
view model =
div []
[ input [ onInput AddTask, placeholder (translate "addTaskPlaceholder" model.language) ] []
, ul [] (List.map (viewTask model.language) model.tasks)
, select [ onChange ChangeLanguage ]
[ option [ value "en", selected (model.language == "en") ] [ text "English" ]
, option [ value "fr", selected (model.language == "fr") ] [ text "French" ]
, option [ value "es", selected (model.language == "es") ] [ text "Spanish" ]
]
]
viewTask : String -> Task -> Html Msg
viewTask language task =
li []
[ input [ type_ "checkbox", checked task.completed, onClick (ToggleTask task.id) ] []
, text (task.description ++ " (" ++ (translate (if task.completed then "completed" else "pending") language) ++ ")")
]
translate : String -> String -> String
translate key language =
case language of
"en" ->
case key of
"addTaskPlaceholder" -> "Add a task..."
"completed" -> "Completed"
"pending" -> "Pending"
_ -> "Translation not found"
"fr" ->
case key of
"addTaskPlaceholder" -> "Ajouter une tรขche..."
"completed" -> "Terminรฉe"
"pending" -> "En attente"
_ -> "Traduction non trouvรฉe"
"es" ->
case key of
"addTaskPlaceholder" -> "Aรฑadir una tarea..."
"completed" -> "Completada"
"pending" -> "Pendiente"
_ -> "Traducciรณn no encontrada"
_ -> "Translation not found"
5. ๋ฉ์ธ ํจ์
๋ฉ์ธ ํจ์๋ ์ด๊ธฐ ํ ์ผ ๋ชฉ๋ก๊ณผ ๊ธฐ๋ณธ ์ธ์ด๋ก Elm ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐํํฉ๋๋ค.
main : Program Never Model Msg
main =
Html.beginnerProgram
{ model = { tasks = [], language = "en" }
, view = view
, update = update
}
์ด ์์ ๋ Elm ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตญ์ ํ ์ง์ ๊ธฐ๋ฅ์ ๊ฐ์ถ ๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ๊ด์ฌ์ฌ ๋ถ๋ฆฌ์ ๋ช ์์ ์ธ ์ํ ๊ด๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก์ง๊ณผ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค.
Elm ์ํคํ ์ฒ ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
Elm ์ํคํ ์ฒ๋ฅผ ์ต๋ํ ํ์ฉํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ๋ชจ๋ธ์ ๋จ์ํ๊ฒ ์ ์งํ๊ธฐ: ๋ชจ๋ธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ์ ํํ๊ฒ ๋ํ๋ด๋ ๋จ์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ฌ์ผ ํฉ๋๋ค. ๋ถํ์ํ ๋ฐ์ดํฐ๋ ๋ณต์กํ ๋ก์ง์ ๋ชจ๋ธ์ ์ ์ฅํ์ง ๋ง์ญ์์ค.
- ์๋ฏธ ์๋ ๋ฉ์์ง ์ฌ์ฉํ๊ธฐ: ๋ฉ์์ง๋ ์ค๋ช ์ ์ด์ด์ผ ํ๋ฉฐ ์ํํด์ผ ํ ์์ ์ ๋ช ํํ๊ฒ ๋ํ๋ด์ผ ํฉ๋๋ค. ์ ๋์ธ(union)์ ์ฌ์ฉํ์ฌ ๋ค์ํ ์ ํ์ ๋ฉ์์ง๋ฅผ ์ ์ํ์ญ์์ค.
- ์์ ํจ์ ์์ฑํ๊ธฐ: ๋ทฐ์ ์ ๋ฐ์ดํธ ํจ์๊ฐ ์์ ํจ์์ธ์ง ํ์ธํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ํ ์คํธํ๊ณ ์ถ๋ก ํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค.
- ๋ชจ๋ ๊ฐ๋ฅํ ๋ฉ์์ง ์ฒ๋ฆฌํ๊ธฐ: ์
๋ฐ์ดํธ ํจ์๋ ๋ชจ๋ ๊ฐ๋ฅํ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
case๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ค์ํ ๋ฉ์์ง ์ ํ์ ์ฒ๋ฆฌํ์ญ์์ค. - ๋ณต์กํ ๋ทฐ ๋ถ๋ฆฌํ๊ธฐ: ๋ทฐ ํจ์๊ฐ ๋๋ฌด ๋ณต์กํด์ง๋ฉด ๋ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ํจ์๋ค๋ก ๋๋์ญ์์ค.
- Elm์ ํ์ ์์คํ ์ฌ์ฉํ๊ธฐ: Elm์ ๊ฐ๋ ฅํ ํ์ ์์คํ ์ ์ต๋ํ ํ์ฉํ์ฌ ์ปดํ์ผ ์๊ฐ์ ์ค๋ฅ๋ฅผ ์ก์๋ด์ญ์์ค. ์ฌ์ฉ์ ์ ์ ํ์ ์ ์ ์ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ด์ญ์์ค.
- ํ ์คํธ ์์ฑํ๊ธฐ: ๋ทฐ์ ์ ๋ฐ์ดํธ ํจ์์ ๋ํ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ์ฌ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ์ญ์์ค.
๊ณ ๊ธ ๊ฐ๋
๊ธฐ๋ณธ์ ์ธ Elm ์ํคํ ์ฒ๋ ๊ฐ๋จํ์ง๋ง, ํจ์ฌ ๋ ๋ณต์กํ๊ณ ์ ๊ตํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋์์ด ๋๋ ๋ช ๊ฐ์ง ๊ณ ๊ธ ๊ฐ๋ ์ด ์์ต๋๋ค:
- ์ปค๋งจ๋(Commands): ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํ๋ฉด HTTP ์์ฒญ์ ๋ณด๋ด๊ฑฐ๋ ๋ธ๋ผ์ฐ์ API์ ์ํธ์์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ถ์์ฉ์ ์ํํ ์ ์์ต๋๋ค. ์ปค๋งจ๋๋ ์ ๋ฐ์ดํธ ํจ์์ ์ํด ๋ฐํ๋๋ฉฐ Elm ๋ฐํ์์ ์ํด ์คํ๋ฉ๋๋ค.
- ๊ตฌ๋ (Subscriptions): ๊ตฌ๋ ์ ์ฌ์ฉํ๋ฉด ํค๋ณด๋ ์ด๋ฒคํธ๋ ํ์ด๋จธ ์ด๋ฒคํธ์ ๊ฐ์ด ์ธ๋ถ ์ธ๊ณ์ ์ด๋ฒคํธ๋ฅผ ์์ ํ ์ ์์ต๋๋ค. ๊ตฌ๋ ์ ๋ฉ์ธ ํจ์์์ ์ ์๋๋ฉฐ ๋ฉ์์ง๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ฌ์ฉ์ ์ ์ ์์(Custom Elements): ์ฌ์ฉ์ ์ ์ ์์๋ฅผ ์ฌ์ฉํ๋ฉด Elm ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ์ ์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
- ํฌํธ(Ports): ํฌํธ๋ฅผ ์ฌ์ฉํ๋ฉด Elm๊ณผ JavaScript ๊ฐ์ ํต์ ํ ์ ์์ต๋๋ค. ์ด๋ Elm์ ๊ธฐ์กด JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํตํฉํ๊ฑฐ๋ Elm์์ ์์ง ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ API์ ์ํธ์์ฉํ ๋ ์ ์ฉํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
Elm ์ํคํ ์ฒ๋ Elm์์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฐ๋ ฅํ๊ณ ์์ธก ๊ฐ๋ฅํ ํจํด์ ๋๋ค. ๋ถ๋ณ์ฑ, ์์์ฑ, ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ์์น์ ๋ฐ๋ฅด๋ฉด ์ดํดํ๊ณ , ์ ์ง๋ณด์ํ๊ณ , ํ ์คํธํ๊ธฐ ์ฌ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. Elm ์ํคํ ์ฒ๋ ๋ ์ ๋ขฐํ ์ ์๊ณ ๊ฒฌ๊ณ ํ ์ฝ๋๋ฅผ ์์ฑํ๋๋ก ๋์์ฃผ์ด ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง๋๋ค. ์ด๊ธฐ ํ์ต ๊ณก์ ์ด ๋ค๋ฅธ ํ๋ก ํธ์๋ ํ๋ ์์ํฌ๋ณด๋ค ๊ฐํ๋ฅผ ์ ์์ง๋ง, Elm ์ํคํ ์ฒ์ ์ฅ๊ธฐ์ ์ธ ์ด์ ์ ์ง์งํ ์น ๊ฐ๋ฐ์์๊ฒ ๊ฐ์น ์๋ ํฌ์๊ฐ ๋ ๊ฒ์ ๋๋ค. Elm ์ํคํ ์ฒ๋ฅผ ๋ฐ์๋ค์ด๋ฉด, ๋ค์ํ ๊ธฐ์ ์์ค๊ณผ ์๊ฐ๋๋ฅผ ๊ฐ์ง ์ ์ธ๊ณ์ ์ผ๋ก ๋ถ์ฐ๋ ํ์์๋ ๋ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ณ ์ฆ๊ฑฐ์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ฒ ๋ ๊ฒ์ ๋๋ค. ๋ช ํํ ๊ตฌ์กฐ์ ํ์ ์์ ์ฑ์ ํ์ ๊ณผ ์ฅ๊ธฐ์ ์ธ ํ๋ก์ ํธ ์ฑ๊ณต์ ์ํ ๊ฒฌ๊ณ ํ ๊ธฐ๋ฐ์ ์ ๊ณตํฉ๋๋ค.